package com.reconcile.phone.web.controller.call;

import cn.dev33.satoken.annotation.SaIgnore;
import com.reconcile.phone.common.annotation.RepeatSubmit;
import com.reconcile.phone.common.constant.Constants;
import com.reconcile.phone.common.core.domain.R;
import com.reconcile.phone.common.core.domain.model.SmsLoginBody;
import com.reconcile.phone.system.service.SysLoginService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.constraints.NotBlank;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * app端登录
 *
 * @author zxl
 * @since 2024/1/22
 */
@Slf4j
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/phone/mobile")
public class RpLoginController {

    private final SysLoginService loginService;


    /**
     * 短信登录(无账号自动注册)
     *
     * @param smsLoginBody 登录信息
     * @return 结果
     */
    @SaIgnore
    @PostMapping("/smsLogin")
    public R<Map<String, Object>> smsLogin(@Validated @RequestBody SmsLoginBody smsLoginBody) {
        Map<String, Object> ajax = new HashMap<>();
        // 生成令牌
        String token = loginService.smsLoginOrRegister(smsLoginBody.getPhonenumber(), smsLoginBody.getSmsCode());
        ajax.put(Constants.TOKEN, token);
        return R.ok(ajax);
    }


    /**
     * app一键登录(无账号自动注册)
     *
     * @param accessToken 阿里云token
     * @return 结果
     */
    @SaIgnore
    @PostMapping("/appOneClick")
    public R<Map<String, Object>> appOneClick(String accessToken) {
        Map<String, Object> ajax = new HashMap<>();
        // 生成令牌
        String token = loginService.appOneClick(accessToken);
        ajax.put(Constants.TOKEN, token);
        return R.ok(ajax);
    }


    /**
     * 小程序登录
     *
     * @param code 小程序登陆code
     * @return 结果
     */
    @SaIgnore
    @PostMapping("/xcxLogin")
    public R<Map<String, Object>> xcxLogin(@NotBlank(message = "小程序登录code不能为空") String code) {
        log.info("小程序登录===" + code);
        return R.ok(loginService.xcxLogin(code));
    }

    /**
     * 第一次小程序登录,绑定手机号
     *
     * @param loginCode 小程序登陆凭证(和登录是一个code)
     * @param phoneCode 小程序获取手机号凭证
     * @return token
     */
    @SaIgnore
    @PostMapping("/xcxFirstLogin")
    @RepeatSubmit(interval = 10, timeUnit = TimeUnit.SECONDS, message = "正在登陆,请稍后")
    public R<Map<String, Object>> xcxFirstLogin(@NotBlank(message = "小程序登录code不能为空") String loginCode,
                                                @NotBlank(message = "小程序获取手机号code不能为空") String phoneCode) {
        log.info("第一次小程序登录===" + loginCode + "[][][]][]" + phoneCode);
        return R.ok(loginService.xcxFirstLogin(loginCode, phoneCode));

    }

    /**
     * 邀请码登录
     *
     * @param code           小程序登陆code
     * @param invitationCode 扫描人邀请码
     * @return 结果
     */
    @SaIgnore
    @PostMapping("/yqmLogin")
    public R<Map<String, Object>> yqmLogin(@NotBlank(message = "小程序登录code不能为空") String code,
                                           @NotBlank(message = "邀请码不能为空") String invitationCode) {
        log.info("邀请码登录====" + code + "[][][]][]" + invitationCode);
        return R.ok(loginService.yqmLogin(code, invitationCode));
    }

    /**
     * 邀请码第一次小程序登录,绑定手机号
     *
     * @param loginCode      小程序登陆凭证
     * @param phoneCode      小程序获取手机号凭证
     * @param invitationCode 扫描人邀请码
     * @return token
     */
    @SaIgnore
    @PostMapping("/yqmFirstLogin")
    @RepeatSubmit(interval = 10, timeUnit = TimeUnit.SECONDS, message = "正在登陆,请稍后")
    public R<Map<String, Object>> yqmFirstLogin(@NotBlank(message = "小程序登录code不能为空") String loginCode,
                                                @NotBlank(message = "小程序获取手机号code不能为空") String phoneCode,
                                                @NotBlank(message = "邀请码不能为空") String invitationCode) {
        log.info("邀请码第一次小程序登录====" + loginCode + "[][][]][]" + phoneCode + "[][][]][]" + invitationCode);
        return R.ok(loginService.yqmFirstLogin(loginCode, phoneCode, invitationCode));

    }
}
